//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "convexo.h"
#include "lista.cpp"

//---------------------------------------------------------------------------

#pragma package(smart_init)

Convexo::Convexo(Lista <PV> *vert){
          vertices=vert;
          nVertices=vert->dameNumNodos();
          normales=new Lista<PV>();
          PV * v;
          for(int i=1;i<nVertices;i++){
                v=new PV();
                v->vectorDosPV(vertices->dameDato(i),vertices->dameDato(i+1));
                v->calculaNormal();
                v->normalizacion(); 
                normales->anadir(v);
          }
          v=new PV();
          v->vectorDosPV(vertices->dameDato(nVertices),vertices->dameDato(1));
          v->calculaNormal();
          v->normalizacion();
          normales->anadir(v);
          nrebotes = 0;
          //rebotereciente = false;
         //rebotereciente=new int[50];
         for(int i=0;i<50;i++)
                rebotereciente[i]=0;
}
void Convexo::draw(){

        glBegin(GL_POLYGON);
        for(int i=1; i<=nVertices;i++){
                glColor3f(0.7+-i*0.1,0+i*0.05,0.9-i*0.1);
                for(int i=0;i<50;i++){
                if (rebotereciente[i]!=0){
                      glColor3f(0.5,0.5,0.5);
                }
                }
                glVertex2f(vertices->dameDato(i)->getX(),vertices->dameDato(i)->getY());
        }
        glEnd();
        
}
bool Convexo::colision(PV* centro, PV* sentido,GLdouble radio,GLdouble &tin, PV *&normal){
        GLdouble tout,thit;
        bool seguir=true;
        PV * v=new PV();
        PV * q,*n;


        int i=1;
        tin=0.;
        tout=1.;
        GLdouble den,num;

        while (i<=nVertices && seguir){

                den=sentido->prodEscalar(sentido,normales->dameDato(i));
                n=normales->dameDato(i)->copiar();
                n->escalacion(radio);
                q=n->resta(centro,n);
                delete n;
                v->vectorDosPV(q,vertices->dameDato(i));
                delete q;

                num=v->prodEscalar(v,normales->dameDato(i));
                if(-EPSILON<den && den<EPSILON){ //caso raro
                       if (!(num>EPSILON)) seguir =false; //casos raros 1 y 2

                }else{
                        thit=num/den;
                        if(den<-EPSILON) tin=max(tin,thit);
                        else tout= min(tout,thit);
                        seguir=(tin<=tout);
                        if(tin==thit){

                                normal->setX(normales->dameDato(i)->getX());
                                normal->setY(normales->dameDato(i)->getY());
                        }


                }
                i++;

        }
        delete v;
        return seguir;
}


